#ifndef _igslib_util_
#define _igslib_util_

#include <vector>
namespace igslib
{
    namespace util
    {
        /*!
         * 取得目前平台的Fuse狀態。
         * @return 目前平台的Fuse狀態。
         *     -1: 無法開啟裝置。
         *     -2: 無法取得資訊。
         * @note
         *     + 對igs038而言有幾個重要的bit：
         *         - bit1是 inter fuse，true代表有燒斷，需顯示讓QC知道是否有燒斷。
         *         - bit2是 boot mode，true表示只能由內部開機。
         *         - bit3是 j-tag fuse，true代表有燒斷，需顯示讓QC知道是否有燒斷。
         */
        int GetFuseState();
        /*!
         * 取得平台唯一辨識碼UUID(Universally Unique Identifiers)。
         * @return UUID字串。若發生任何錯誤則會回傳"ERROR"。
         * @note 在A38平台上是以MAC位址做為UUID的內容。
         */
        std::string GetUUID();
        /*!
         * 使行程(process)沈睡(處於idle狀態)一段時間。
         * @param [in] value 時間值，單位為毫秒。
         */
        void SleepMSTime(int value);
        /*!
         * 取得目前系統中可使用之記憶體空間。
         * @return 可使用之記憶體空間。
         */
        unsigned long long GetAvailableMemoryBytes();
        /*!
         * 取得自開機到目前為止，經過的毫秒數。
         * @return 經過的毫秒數。
         */
        size_t GetTicks();
        /*!
         * 取得使用者按鍵傳回之可列印字元碼。
         * @return
         *     >0：有按鍵則傳回可列印字元碼
         *     =0：沒有按鍵。
         *     -1: 無法取得終端機屬性。
         *     -2: 無法設定終端機屬性。
         *     -3: 裝置控制失敗。
         * @note 此函式無須等待使用者按下enter鍵即會結束。
         */
        int KbHit();
        /*!
         * 取得fps(Frame Per Second).
         * @return fps
         */
        float GetFPS();
        /*!
         * 在stdout及logcat中都送出訊息。
         * @note
         *     在logcat中送出的訊息標籤為<igslib log>。
         */
        void Log(const char* format, ...);
        /*!
         * 底層的裝置節點因驅動程式實作差異，有可能無法使用fopen或ftell等標準IO函式存取。
         * 需使用低階開檔方式取得才行。
         * @param a0 節點名稱。
         * @return 取得之資訊。若發生任何錯誤，則會傳回"ERROR"。
         * @note
         *     若一般使用者亦無讀取權限的話，此函式仍會丟出exception。
         */
        std::string ReadDeviceNodeInfo(const std::string&);
        /*!
         * 底層的裝置節點因驅動程式實作差異，有可能無法使用fopen或ftell等標準IO函式存取。
         * 需使用低階開檔方式寫入才行。
         * @param a0 節點名稱。
         * @param a1 寫入資訊。
         * @return 寫入byte數。
         *     0: 操作正常。
         *     -1: 裝置存取錯誤。
         * @note
         *     若一般使用者亦無寫入權限的話，此函式仍會丟出exception。
         */
        int WriteDeviceNodeInfo(const std::string&,const std::string&);
        /*!
         * 取得序列化資料的數位指紋。
         * @param a0 序列化資料。
         * @return 數位指紋
         */
        std::vector<unsigned char> GetDigest(const std::vector<unsigned char>&);
        /*!
         * 將序列化資料做對稱式加密處理。
         * @param a0 金鑰資料。
         * @param a1 輸入資料。
         * @return 處理後資料。
         */
        std::vector<unsigned char> SymmetricEncrypt(const std::vector<unsigned char>&,const std::vector<unsigned char>&);
        /*!
         * 將序列化資料做對稱式解密處理。
         * @param a0 金鑰資料。
         * @param a1 輸入資料。
         * @return 處理後資料。
         */
        std::vector<unsigned char> SymmetricDecrypt(const std::vector<unsigned char>&,const std::vector<unsigned char>&);
        /*!
         * 取得距離上次呼叫此函式所經過的微秒數。
         * @return 微秒數。
         */
        double GetElapsedMilliseconds();
        /*!
         * 取得版控系統的版本號。
         * @return 版控系統的版本號。
         */
        std::string GetRevision();
    };
};
#endif
